Support a gtk.gresource file in themes
authorAlexander Larsson <alexl@redhat.com>
Fri, 3 Feb 2012 14:50:49 +0000 (15:50 +0100)
committerAlexander Larsson <alexl@redhat.com>
Fri, 3 Feb 2012 14:50:49 +0000 (15:50 +0100)
This lets themes install a .gresource for efficient loading
of resources. This resource file will (if it exists) be automatically
loaded (mmaped) when the theme is used and unloaded when not used.

gtk/gtkcssprovider.c

index dbbf92a00b4b4a6bf3c64a75fbfb8f179367f7d9..e499db5d9474b3f948c9797e667a16b417eda9fa 100644 (file)
@@ -985,6 +985,7 @@ struct _GtkCssProviderPrivate
   GHashTable *symbolic_colors;
 
   GArray *rulesets;
+  GResource *resource;
 };
 
 enum {
@@ -1591,6 +1592,13 @@ gtk_css_provider_finalize (GObject *object)
   if (priv->symbolic_colors)
     g_hash_table_destroy (priv->symbolic_colors);
 
+  if (priv->resource)
+    {
+      g_resources_unregister (priv->resource);
+      g_resource_unref (priv->resource);
+      priv->resource = NULL;
+    }
+
   G_OBJECT_CLASS (gtk_css_provider_parent_class)->finalize (object);
 }
 
@@ -2901,8 +2909,20 @@ gtk_css_provider_get_named (const gchar *name,
 
       if (path)
         {
+         char *dir, *resource_file;
+         GResource *resource;
+
           provider = gtk_css_provider_new ();
 
+         dir = g_path_get_dirname (path);
+         resource_file = g_build_filename (dir, "gtk.gresource", NULL);
+         resource = g_resource_load (resource_file, NULL);
+         if (resource != NULL)
+           {
+             provider->priv->resource = resource;
+             g_resources_register (resource);
+           }
+
           if (!gtk_css_provider_load_from_path (provider, path, NULL))
             {
               g_object_unref (provider);